package com.app.micaihu.base;

import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.app.micaihu.R;
import com.app.widget.LoadView;
import com.app.micaihu.utils.AppViewUtils;
import com.app.utils.pulltorefresh.PullToRefreshBase;
import com.app.utils.pulltorefresh.PullToRefreshListView;

import java.util.List;

/**
 * 通用的展示list数据的activity
 * 
 * @author linkai
 * 
 */
public abstract class BaseListActivity<T> extends BaseOldActivity implements
		 PullToRefreshBase.OnRefreshListener2<ListView>,
		OnClickListener, OnItemClickListener  {

	public final int NO_NET = 0;// 网络错误
	public final int DATAERROR = 1;// 数据错误
	public final int LOADING = 2;// 数据加载中
	public final int LOADSUCES = 3;// 加载成功
	public final int DATAEMPTY = 4;// 数据为空
	// 数据变量
	protected List<T> dataList;// 数据对象集合
	protected AppBaseAdapter<T> mAdapter;// 数据适配器

	// 控件变量
	protected PullToRefreshListView mListView;// 上拉下拉刷新listview
	protected LoadView mLoadView;// 加载数据等待提示控件
	protected TextView notify_view_text;// 蓝色通知栏内的文字

	// 逻辑变量
	protected int dataPage = 1;// 请求的数据页数
	protected FrameLayout flCommonBottom;//最底部菜单栏
	protected ViewGroup mContentView;//根布局

	/************************** Activity必要的重写的方法 start **************************/
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mContentView = (ViewGroup) getLayoutInflater().inflate(R.layout.activity_public_list, null);
		addContentView(mContentView);
		// 初始化页面控件以及数据
		initView();
		// 初始化数据
		changeData(true);
	}

	/**
	 * 初始化页面控件以及该显示的数据
	 */
	private void initView() {
		mListView = (PullToRefreshListView) findViewById(R.id.prlv_listview);
		mLoadView = (LoadView) findViewById(R.id.ld_loadview);
		// Toast提示框
		notify_view_text = (TextView) findViewById(R.id.tv_notify);
		mLoadView.setErrorPageClickListener(this);

		// 配置mListView
		AppViewUtils.initPullToRefreshListView(mListView);
		mListView.setEmptyView(mLoadView);
		mListView.setOnRefreshListener(this);
		mListView.setOnItemClickListener(this);
		// 因为有的页面不需要自动加载，所以这里写成虚方法，让各自页面根据需要实现
		setListViewOnLastItemVisibleListener();

		flCommonBottom = (FrameLayout) findViewById(R.id.fl_common_bottom);
		//子类实现改变页面View的方法
		changeView();

	}

	/**
	 * 改变页面view的方法
	 * 子类如果想改变页面就重写该方法
	 */
	protected void changeView(){

	}

	/************************** Activity所有重写的方法 end **************************/

	/*************************** 所有操作数据的方法 start ***************/

	/**
	 * 改变listview显示的数据
	 * 
	 * @param isRefresh
	 *            是否刷新
	 */
	protected abstract void changeData(final boolean isRefresh);

	/**
	 * 重载的Loadview EmptyView的方法
	 * @param code DATAEMPTY
	 * @param resId 对应的图片
	 * @param msg   暂时最多传两个String，第一个对应小字体，第二个对应加粗字体
	 */
	protected  void setLoadView(int code,int resId,String... msg){
		switch(code){
			case DATAEMPTY:
				if (dataList == null || dataList.size() == 0) {
					mLoadView.showEmptyPage(resId,msg);
				}
				if(mListView!= null && mListView.isRefreshing()){
					mListView.onRefreshComplete();
				}
				break;
		}

	}

	/**
	 * LoadViewd 方法
	 * @param code 传入对应的值
	 * @param msg  提示的的文字
	 *
	 *
	 */
	protected void setLoadView(int code, String msg) {
		switch (code) {
			case NO_NET://网络错误
				if (dataList == null || dataList.size() == 0) {
					mLoadView.showErrorPage(msg);
				}
				if(mListView != null){
					mListView.onRefreshComplete();
				}
				break;
			case DATAERROR://数据错误
				if (dataList == null || dataList.size() == 0) {
					mLoadView.showErrorPage(msg);
				}
				if(mListView != null){
					mListView.onRefreshComplete();
				}
				break;
			case LOADING://加载中
				if (dataList == null || dataList.size() == 0) {
					mLoadView.showLoadPage(msg);
				}
				break;
			case LOADSUCES://加载成功
				if (dataList == null || dataList.size() == 0) {
					mLoadView.showSuccess();
				}
				if(mListView != null){
					//mListView.onRefreshComplete();
					mListView.postDelayed(new Runnable() {
						@Override
						public void run() {
							mListView.onRefreshComplete();
						}
					}, 500);
				}
				break;
		}
//		if (msg != null && !"".equals(msg)) {
		if (!TextUtils.isEmpty(msg)) {
			notify_view_text.setText(msg);
			notify_view_text.setVisibility(View.VISIBLE);
			new Handler().postDelayed(new Runnable() {

				@Override
				public void run() {
					notify_view_text.setVisibility(View.GONE);
				}
			}, 2000);
		}
	}







	/**
	 * 刷新数据
	 */
	protected void flushData() {
		if (mListView == null) {
			return;
		}
		mListView.onRefreshComplete();
		mListView.setRefreshing();
		mListView.getRefreshableView().setSelection(0);
	}

	/**
	 * 回到顶部
	 */
	public void toScrollTop() {
		if (mListView == null ) {
			return;
		}
		mListView.getRefreshableView().setSelection(0);
	}

	/*************************** 所有操作数据的方法 end ***************/

	/************************ 所有的事件 start *************************/


	// 所有单机事件
	@Override
	public void onClick(View view) {
		if(view == null){
			return;
		}
		switch (view.getId()) {
		case R.id.error_page:// 重新加载页面数据
			if (mListView.isRefreshing())
				break;
			changeData(true);
			break;
		default:

			break;
		}
	}


	// 需要重写的 listview的item的单击事件
	@Override
	public abstract void onItemClick(AdapterView<?> parent, View view,
			int position, long id);

	// 设置listview的最后一行显示的监听事件
	public void setListViewOnLastItemVisibleListener() {
		// 本类中这句代码AppViewUtils.initPullToRefreshListView(getActivity(),
		// mListView);
		// 已经设置了listview自动加载下一页了
		// 如果不想listview自动加载下一页就重写本方法设置listview最后一行显示的监听为null
		// mListView.setOnLastItemVisibleListener(null);
	};



	// listview下拉刷新
	@Override
	public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
		dataPage = 1;
		changeData(true);
	}

	// listview上拉请求下一页
	@Override
	public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {

		dataPage++;
		changeData(false);
	}

	/************************ 所有的事件 end *************************/

}
